﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Autocentro.Entities;
using Autocentro.Respository;
using Microsoft.Practices.Unity;

namespace Autocentro.BussinesLogic
{
    public class ProformaBL : IProformaBL
    {
        [Dependency]
        public IProformaRepository ProformaRepository { get; set; }

        [Dependency]
        public IProductoRepository ProductoSerRepository { get; set; }

        [Dependency]
        public IDetalleProformaRepository DetProformaRepository { get; set; }

        public List<PROFORMA> GetAllFromProforma()
        {
            return ProformaRepository.GetAllFromProforma();
        }

        public List<PROFORMA> GetAllFromProformasByCriterio(string criterio)
        {
            return ProformaRepository.GetAllFromProformasByCriterio(criterio);
        }
        public PROFORMA GetFromProformaByID(int id)
        {
            return ProformaRepository.GetProformaById(id);
        }

        public void AddProforma(PROFORMA proforma)
        {
            var msg = "";
            var ok = proforma.Validate(out msg);
            if (ok)
            {
                //ValidarUnidadMedida(proforma);
                //ValidarStock(proforma);

                ProformaRepository.AddProforma(proforma);
            }
            else
            {
                throw new Exception(msg);
            }
        }

        public void UpdateProforma(PROFORMA proforma)
        {
            var msg = "";
            var ok = proforma.Validate(out msg);
            if (ok)
            {
                //ValidarUnidadMedida(proforma);
                //ValidarStock(proforma);

                ProformaRepository.UpdateProforma(proforma);
            }
            else
            {
                throw new Exception(msg);
            }
        }

        private void ValidarUnidadMedida(PROFORMA _proforma)
        {
            //foreach (var item in _proforma.DetalleProforma)
            //{
            //    if (item.Producto.ProductoServicio == true) //es servicio, und medida = 1
            //    {
            //        if (item.IdUnidadMedida == 0 || item.IdUnidadMedida != 1)
            //        {
            //            throw new Exception(string.Format("El servicio {0}," + " requiere la Unidad de Medida 'SRV'", item.Producto.Descripcion));   
            //        }
            //    }
            //    if (item.Producto.ProductoServicio == false) //no es servicio, und medida > 1
            //    {
            //        if (item.IdUnidadMedida == 0)
            //        {
            //            throw new Exception(string.Format("El producto {0}," + " requiere una Unidad de Medida.", item.Producto.Descripcion));
            //        }
            //        if (item.IdUnidadMedida == 1)
            //        {
            //            throw new Exception(string.Format("El producto {0}," + " requiere una Unidad de Medida diferente a 'SRV'", item.Producto.Descripcion));
            //        }
            //    }
            //}
        }

        private void ValidarStock(PROFORMA proforma)
        {
            foreach (var item in proforma.DetalleProforma)
            {
                var producto = ProductoSerRepository.GetFromProductoByID(item.IdProductoTipoVehiculo);

                if (producto.ProductoServicio == false)
                {
                            var cantActualDetalle = DetProformaRepository.GetProdServFromDetalleProformaByProformaId(item.IdProductoTipoVehiculo, proforma.Id);

                            if (cantActualDetalle == null)
                            {
                                if (item.Cantidad > producto.Stock)
                                {
                                    throw new Exception(string.Format("No hay Stock suficiente para el producto {0}," +
                                                      " solo quedan {1} Und.", producto.Descripcion, producto.Stock));
                                }
                            }
                            if (cantActualDetalle != null)
                            {
                                var stockActual = producto.Stock + cantActualDetalle.Cantidad;
                                if (item.Cantidad > stockActual)
                                {
                                    throw new Exception(string.Format("La maxima cantidad a elegir del producto {0}," +
                                                      " es {1} Und.", producto.Descripcion, stockActual));
                                }
                            }
                }
            }
        }

        public void RemoveProforma(int id)
        {
            ProformaRepository.RemoveProforma(id);
        }


        public List<PROFORMA> GetFromProformasbyFechasAndVehiculo(DateTime? fec1, DateTime? fec2, string vehiculo)
        {
            return ProformaRepository.GetFromProformasbyFechasAndVehiculo(fec1, fec2, vehiculo);
        }

       
    }
}
